package com.baaio.conn;

import java.util.ArrayList;
/**
 * Transaction工厂类，两个静态的方法可以得到Transaction的实例<br>
 * 在得到Transaction的实例后调用getBaaio()，方法获得Transaction的实现类TransactionConnImpl；<br>
 * TransactionConnImpl实现类实现了BaaioConnImpl的方法。详细使用方法请查看BaaioConnImpl<br>
 * 
 * 该工厂维护了一个ArrayList<br>
 * 在每次创造一个Transaction对象后，这个对象的引用就好装载到ArrayList里面<br>
 * 无论你创造多少个。<br>
 * 最后用工厂的实例调用invoke方法执行事务处理<br>
 * 
 *事务的使用方法如下：<br>
 *以两次删除和一次更新为例：<br>
 *
 *TransactionGlobalFactory tsf = TransactionGlobalFactory.getInstance();<br>
 *Transaction ts = TransactionGlobalFactory.createTransaction();<br>
 *TransactionConnImpl tsimlp = ts.getBaaio();<br>
 *HashMap<String,String> map = new HashMap<String,String>();<br>
 *map.put("name","baaio");<br>
 *tsimlp.removeData("study","where name='baaio'");<br>
 *tsimlp.removeData("study","where name='520'");<br>
 *tsimlp.removeData("study","where name='520'"); <br>
 *tsimlp.updateData("study",map,"where name='dfd'");<br>
 *tsf.invoke();  //最后调用invoke方法执行事务<br>
 *<br>
 * ===================以上为同一个数据库里的事务=================================<br>
 * <br>
 * <br>
 * ===================以下为两个数据库的事务=====================================<br>
 * TransactionGlobalFactory tsf = TransactionGlobalFactory.getInstance();<br>
 * <br>
 * Transaction ts = TransactionGlobalFactory.createTransaction();<br>
 * TransactionConnImpl tsimlp = ts.getBaaio();<br>
 * tsimlp.removeData("study","where name='baaio'");<br>
 * <br>
 * Transaction ts2 = TransactionGlobalFactory.createTransaction("test");<br>
 * TransactionConnImpl tsimlp2 = ts2.getBaaio("test");<br>
 * tsimlp2.removeData("test","where name='baaio'");<br>
 * tsf.invoke(); //最后调用invoke方法执行事务<br>
 * 
 * !!! 注意该TransactionGlobalFactory全项目只有一个。可以在多个页面使用事务。在程序的结尾才能调用invoke方法,否则会报错<br>
 * 
 * 
 *
 */

public class TransactionGlobalFactory
{
    private static ArrayList<Transaction> list = new ArrayList<Transaction>();
    
    private static TransactionGlobalFactory tsf;
    private TransactionGlobalFactory()
    {
    }
    /**
     * 获得工厂类的实例
     * @return TransactionFactory
     */
    public static TransactionGlobalFactory getInstance()
    {
        if(tsf == null)
        {
            tsf = new TransactionGlobalFactory();
        }
            return tsf;
        
    }
    
    /**
     * 获得Transaction的实例
     * @return Transaction
     */
    public static Transaction createTransaction()
    {
         Transaction t = new Transaction();
        list.add(t);
        return t;
    }
    
    /**
     * 获得Transaction的实例
     * @param DBName 其它数据库名称
     * @return
     */
    public static Transaction createTransaction(String DBName)
    {
         Transaction t2 = new Transaction(DBName);
        list.add(t2);
        return t2;
    }
    
    /**
     * 执行事务
     * 
     */
    public void invoke()
    {
        boolean f = true;
        for(Transaction ts : list)
        {
            f = ts.invokeAll();
            if(!f)
            {
                GetStatement.dbTClose();
                break;
            }
        }
        if(f)
        {
            for(Transaction ts : list)
            {
                ts.invoke();
            }
            GetStatement.dbTClose();
        }
    }
}
